{
 "cells": [
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "3977db3f",
   "metadata": {},
   "source": [
    "# Iris classification\n",
    "\n",
    "This section of the tutorial makes use of the <span class=\"html\"><a href=\"https://raw.githubusercontent.com/XanaduAI/qml/master/demonstrations/variational_classifier/data/iris_classes1and2_scaled.txt\" download=\"parity.txt\" target=\"_blank\">Iris Dataset</a></span> which contains the features of the flowers needed to perform a classification task and get the corresponding flower names. We use amplitude encoding for encoding the features in the dataset and use a Quantum machine learning model to perform the classification."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "819251c9",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "covalent\n",
      "matplotlib==3.4.3\n",
      "pennylane==0.25.1\n",
      "pennylane-sf==0.20.1\n"
     ]
    }
   ],
   "source": [
    "with open(\"./requirements.txt\", \"r\") as file:\n",
    "    for line in file:\n",
    "        print(line.rstrip())\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "3629b9e2",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Install necessary packages\n",
    "# !pip install -r ./requirements.txt\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "4e51fe54",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pennylane as qml\n",
    "from pennylane import numpy as np\n",
    "import covalent as ct\n",
    "import matplotlib.pyplot as plt\n",
    "from pennylane.optimize import NesterovMomentumOptimizer\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bd74c8e9",
   "metadata": {},
   "source": [
    "We use the Pennylane quantum simulator with 2 qubits to encode real-valued vectors into the amplitudes of a quantum state."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "f41be411",
   "metadata": {},
   "outputs": [],
   "source": [
    "dev = qml.device(\"default.qubit\", wires=2)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "336cd900",
   "metadata": {},
   "source": [
    "Next, we perform the amplitude encoding of the features by first converting the features to angles. We then use a state preparation circuit and feed in those angles and perform the amplitude encoding of the features.\n",
    "\n",
    "As noted in the original [Pennylane tutorial](https://pennylane.ai/qml/demos/tutorial_variational_classifier.html), the circuit is coded according to the scheme in <a class=\"reference external\" href=\"https://arxiv.org/abs/quant-ph/0407010\">Möttönen, et al.\n",
    "(2004)</a>, or as presented\n",
    "for positive vectors only in <a class=\"reference external\" href=\"https://link.springer.com/book/10.1007/978-3-319-96424-9\">Schuld and Petruccione\n",
    "(2018)</a>. Additionally, controlled Y-axis rotations are decomposed into more basic\n",
    "circuits following similar steps in <a class=\"reference external\" href=\"http://www.michaelnielsen.org/qcqi/\">Nielsen and Chuang\n",
    "(2010)</a>.</p>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "07389641",
   "metadata": {},
   "outputs": [],
   "source": [
    "@ct.electron\n",
    "def get_angles(x):\n",
    "\n",
    "    beta0 = 2 * np.arcsin(np.sqrt(x[1] ** 2) / np.sqrt(x[0] ** 2 + x[1] ** 2 + 1e-12))\n",
    "    beta1 = 2 * np.arcsin(np.sqrt(x[3] ** 2) / np.sqrt(x[2] ** 2 + x[3] ** 2 + 1e-12))\n",
    "    beta2 = 2 * np.arcsin(\n",
    "        np.sqrt(x[2] ** 2 + x[3] ** 2) / np.sqrt(x[0] ** 2 + x[1] ** 2 + x[2] ** 2 + x[3] ** 2)\n",
    "    )\n",
    "\n",
    "    return np.array([beta2, -beta1 / 2, beta1 / 2, -beta0 / 2, beta0 / 2])\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "388d162c",
   "metadata": {},
   "outputs": [],
   "source": [
    "def statepreparation(a):\n",
    "    qml.RY(a[0], wires=0)\n",
    "\n",
    "    qml.CNOT(wires=[0, 1])\n",
    "    qml.RY(a[1], wires=1)\n",
    "    qml.CNOT(wires=[0, 1])\n",
    "    qml.RY(a[2], wires=1)\n",
    "\n",
    "    qml.PauliX(wires=0)\n",
    "    qml.CNOT(wires=[0, 1])\n",
    "    qml.RY(a[3], wires=1)\n",
    "    qml.CNOT(wires=[0, 1])\n",
    "    qml.RY(a[4], wires=1)\n",
    "    qml.PauliX(wires=0)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "530f9c25",
   "metadata": {},
   "outputs": [],
   "source": [
    "def layer(W):\n",
    "    qml.Rot(W[0, 0], W[0, 1], W[0, 2], wires=0)\n",
    "    qml.Rot(W[1, 0], W[1, 1], W[1, 2], wires=1)\n",
    "    qml.CNOT(wires=[0, 1])\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4d12ad43",
   "metadata": {},
   "source": [
    "In essence, the variational classifier model contains the state preparation circuit and the quantum model. The measurement is performed using Z-measurement and the result is passed to a classical training system."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "f6efced8",
   "metadata": {},
   "outputs": [],
   "source": [
    "@qml.qnode(dev)\n",
    "def circuit(weights, angles):\n",
    "    statepreparation(angles)\n",
    "\n",
    "    for W in weights:\n",
    "        layer(W)\n",
    "\n",
    "    return qml.expval(qml.PauliZ(0))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c46a9571",
   "metadata": {},
   "source": [
    "We use a mean square loss function as a cost function."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "c2004b04",
   "metadata": {},
   "outputs": [],
   "source": [
    "@ct.electron\n",
    "def square_loss(labels, predictions):\n",
    "    loss = 0\n",
    "    for l, p in zip(labels, predictions):\n",
    "        loss = loss + (l - p) ** 2\n",
    "\n",
    "    loss = loss / len(labels)\n",
    "    return loss\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "653179eb",
   "metadata": {},
   "outputs": [],
   "source": [
    "@ct.electron\n",
    "def variational_classifier(weights, bias, angles):\n",
    "    return circuit(weights, angles) + bias\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cb910f07",
   "metadata": {},
   "source": [
    "<h3>Cost</h3>\n",
    "\n",
    "In supervised learning, the cost function is usually the sum of a loss function and a regularizer. We use the standard square loss that measures the distance between target labels and model predictions."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "3d57f18e",
   "metadata": {},
   "outputs": [],
   "source": [
    "@ct.electron\n",
    "def cost(weights, bias, features, labels):\n",
    "    predictions = [variational_classifier(weights, bias, f) for f in features]\n",
    "    return square_loss(labels, predictions)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "00afbe3b",
   "metadata": {},
   "outputs": [],
   "source": [
    "@ct.electron\n",
    "def load_features(data):\n",
    "    # pad the vectors to size 2^2 with constant values\n",
    "    X = data[:, 0:2]\n",
    "    print(\"First X sample (original)  :\", X[0])\n",
    "\n",
    "    padding = 0.3 * np.ones((len(X), 1))\n",
    "    X_pad = np.c_[np.c_[X, padding], np.zeros((len(X), 1))]\n",
    "    print(\"First X sample (padded)    :\", X_pad[0])\n",
    "\n",
    "    # normalize each input\n",
    "    normalization = np.sqrt(np.sum(X_pad**2, -1))\n",
    "    X_norm = (X_pad.T / normalization).T\n",
    "    print(\"First X sample (normalized):\", X_norm[0])\n",
    "\n",
    "    # angles for state preparation are new features\n",
    "    features = np.array([get_angles(x) for x in X_norm], requires_grad=False)\n",
    "    Y = data[:, -1]\n",
    "    return features, Y, X, X_norm, X_pad\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6ad85f78",
   "metadata": {},
   "source": [
    "<h3>Data</h3>\n",
    "\n",
    "Now, we load the Iris dataset and perform the amplitude encoding. We then pass it to a model. <p>The Iris dataset can be downloaded\n",
    "<span class=\"html\"><a href=\"https://raw.githubusercontent.com/XanaduAI/qml/master/demonstrations/variational_classifier/data/iris_classes1and2_scaled.txt\" download=\"parity.txt\" target=\"_blank\">here</a></span> and should be placed\n",
    "in the subfolder <code class=\"docutils literal notranslate\"><span class=\"pre\">./iris_classes1and2_scaled.txt</span></code>.</p>\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "eafaf470",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "First X sample (original)  : [0.4  0.75]\n",
      "First X sample (padded)    : [0.4  0.75 0.3  0.  ]\n",
      "First X sample (normalized): [0.44376016 0.83205029 0.33282012 0.        ]\n",
      "First features sample      : [ 0.67858523 -0.          0.         -1.080839    1.080839  ]\n"
     ]
    }
   ],
   "source": [
    "data = np.loadtxt(\"assets/iris_classes1and2_scaled.txt\")\n",
    "\n",
    "features, Y, X, X_norm, X_pad = load_features(data)\n",
    "\n",
    "print(\"First features sample      :\", features[0])\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "196bef87",
   "metadata": {},
   "source": [
    "These angles are our new features, which is why we have renamed X to “features” above. Let’s plot the stages of preprocessing and play around with the dimensions (dim1, dim2). Some of them still separate the classes well, while others are less informative.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "b82e16bb",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "plt.figure()\n",
    "plt.scatter(X[:, 0][Y == 1], X[:, 1][Y == 1], c=\"b\", marker=\"o\", edgecolors=\"k\")\n",
    "plt.scatter(X[:, 0][Y == -1], X[:, 1][Y == -1], c=\"r\", marker=\"o\", edgecolors=\"k\")\n",
    "plt.title(\"Original data\")\n",
    "plt.show()\n",
    "\n",
    "plt.figure()\n",
    "dim1 = 0\n",
    "dim2 = 1\n",
    "plt.scatter(X_norm[:, dim1][Y == 1], X_norm[:, dim2][Y == 1], c=\"b\", marker=\"o\", edgecolors=\"k\")\n",
    "plt.scatter(X_norm[:, dim1][Y == -1], X_norm[:, dim2][Y == -1], c=\"r\", marker=\"o\", edgecolors=\"k\")\n",
    "plt.title(\"Padded and normalised data (dims {} and {})\".format(dim1, dim2))\n",
    "plt.show()\n",
    "\n",
    "plt.figure()\n",
    "dim1 = 0\n",
    "dim2 = 3\n",
    "plt.scatter(\n",
    "    features[:, dim1][Y == 1], features[:, dim2][Y == 1], c=\"b\", marker=\"o\", edgecolors=\"k\"\n",
    ")\n",
    "plt.scatter(\n",
    "    features[:, dim1][Y == -1], features[:, dim2][Y == -1], c=\"r\", marker=\"o\", edgecolors=\"k\"\n",
    ")\n",
    "plt.title(\"Feature vectors (dims {} and {})\".format(dim1, dim2))\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "68734ec5",
   "metadata": {},
   "source": [
    "To monitor the generalization performance, we split the dataset into two subsets namely train set and validation set. The train set contains 75% data and the validation set contains 25% data."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "ac82bb5a",
   "metadata": {},
   "outputs": [],
   "source": [
    "@ct.electron\n",
    "def train_val_split(features, Y):\n",
    "    np.random.seed(0)\n",
    "    num_data = len(Y)\n",
    "    num_train = int(0.75 * num_data)\n",
    "    index = np.random.permutation(range(num_data))\n",
    "    feats_train = features[index[:num_train]]\n",
    "    Y_train = Y[index[:num_train]]\n",
    "    feats_val = features[index[num_train:]]\n",
    "    Y_val = Y[index[num_train:]]\n",
    "    return feats_train, Y_train, feats_val, Y_val, index, num_train\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "f43a5813",
   "metadata": {},
   "outputs": [],
   "source": [
    "feats_train, Y_train, feats_val, Y_val, index, num_train = train_val_split(features, Y)\n",
    "X_train = X[index[:num_train]]\n",
    "X_val = X[index[num_train:]]\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "77ef73fd",
   "metadata": {},
   "source": [
    "We check for accuracy by comparing the true parity values with the prediction."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "3984da9a",
   "metadata": {},
   "outputs": [],
   "source": [
    "@ct.electron\n",
    "def accuracy(labels, predictions):\n",
    "\n",
    "    loss = 0\n",
    "    for l, p in zip(labels, predictions):\n",
    "        if abs(l - p) < 1e-5:\n",
    "            loss = loss + 1\n",
    "    loss = loss / len(labels)\n",
    "\n",
    "    return loss\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "294c387a",
   "metadata": {},
   "source": [
    "We initialize the variables randomly (but fix a seed for reproducibility). The first variable in the list is used as a bias, while the rest is fed into the gates of the variational circuit."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "93f29899",
   "metadata": {},
   "outputs": [],
   "source": [
    "@ct.electron\n",
    "def weights_bias_init(num_qubits, num_layers):\n",
    "    weights_init = 0.01 * np.random.randn(num_layers, num_qubits, 3, requires_grad=True)\n",
    "    bias_init = np.array(0.0, requires_grad=True)\n",
    "    return weights_init, bias_init\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a034dcd7",
   "metadata": {
    "tags": []
   },
   "source": [
    "<h3>Optimization</h3>\n",
    "\n",
    "We use a NesterovMomentumOptimizer to perform the training optimization. The advantage of using the NesterovMomentumOptimizier compared to using Gradient Descent is that when a minimum loss path is found, the NesterovMomentumOptimizer uses the momentum to speed up the learning process."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "1a4639e4",
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_optimizer():\n",
    "    return NesterovMomentumOptimizer(0.005)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "422ff7a5",
   "metadata": {},
   "source": [
    "We also optimize the cost."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "5209e7ff",
   "metadata": {},
   "outputs": [],
   "source": [
    "@ct.electron\n",
    "def training(\n",
    "    iterations,\n",
    "    batch_size,\n",
    "    weights,\n",
    "    bias,\n",
    "    num_train,\n",
    "    feats_train,\n",
    "    Y_train,\n",
    "    opt,\n",
    "    feats_val,\n",
    "    Y_val,\n",
    "    Y,\n",
    "):\n",
    "    # print(\"beginning\")\n",
    "    training_steps = []\n",
    "    accuracy_steps_train = []\n",
    "    accuracy_steps_val = []\n",
    "    weights_init = weights\n",
    "    bias_init = bias\n",
    "    for it in range(iterations):\n",
    "        batch_index = np.random.randint(0, num_train, (batch_size,))\n",
    "        # print(\"Here\")\n",
    "        feats_train_batch = feats_train[batch_index]\n",
    "        Y_train_batch = Y_train[batch_index]\n",
    "        # print(\"Here1\")\n",
    "        weights_init, bias_init, _, _ = opt.step(\n",
    "            cost, weights_init, bias_init, feats_train_batch, Y_train_batch\n",
    "        )\n",
    "        # print(\"Here2\")\n",
    "        training_steps.append(it)\n",
    "        # Compute predictions on train and validation set\n",
    "        predictions_train = [\n",
    "            np.sign(variational_classifier(weights_init, bias_init, f)) for f in feats_train\n",
    "        ]\n",
    "        predictions_val = [\n",
    "            np.sign(variational_classifier(weights_init, bias_init, f)) for f in feats_val\n",
    "        ]\n",
    "        # print(\"Here3\")\n",
    "        # Compute accuracy on train and validation set\n",
    "        acc_train = accuracy(Y_train, predictions_train)\n",
    "        acc_val = accuracy(Y_val, predictions_val)\n",
    "        # print(\"Here4\")\n",
    "        accuracy_steps_train.append(acc_train)\n",
    "        accuracy_steps_val.append(acc_val)\n",
    "        # print(\"Here5\")\n",
    "        print(\n",
    "            \"Iter: {:5d} | Cost: {:0.7f} | Acc train: {:0.7f} | Acc validation: {:0.7f} \"\n",
    "            \"\".format(it + 1, cost(weights, bias, features, Y), acc_train, acc_val)\n",
    "        )\n",
    "    return weights_init, bias_init, training_steps, accuracy_steps_train, accuracy_steps_val\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0e8fbd06",
   "metadata": {},
   "source": [
    "*Note: In Covalent, a function can be decorated as a lattice or workflow by using```@ct.lattice```. The decorated function, i.e., the lattice contains electrons which are called as normal functions.*"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "2f486473",
   "metadata": {},
   "outputs": [],
   "source": [
    "@ct.lattice(executor=\"local\")\n",
    "def workflow(\n",
    "    iterations, num_train, num_layers, num_qubits, feats_train, Y_train, feats_val, Y_val, Y\n",
    "):\n",
    "    opt = get_optimizer()\n",
    "    weights, bias = weights_bias_init(num_layers, num_qubits)\n",
    "    batch_size = 10\n",
    "    weights_init, bias_init, training_steps, accuracy_steps_train, accuracy_steps_val = training(\n",
    "        iterations=iterations,\n",
    "        batch_size=batch_size,\n",
    "        weights=weights,\n",
    "        bias=bias,\n",
    "        num_train=num_train,\n",
    "        feats_train=feats_train,\n",
    "        Y_train=Y_train,\n",
    "        opt=opt,\n",
    "        feats_val=feats_val,\n",
    "        Y_val=Y_val,\n",
    "        Y=Y,\n",
    "    )\n",
    "    return weights_init, bias_init, training_steps, accuracy_steps_train, accuracy_steps_val\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9b831f92",
   "metadata": {},
   "source": [
    "The workflow is being dispatched and we can see progress in Covalent dashboard. The results are obtained from the covalent and plotted\n",
    "\n",
    "*Note: The \\\"local\\\" executor is used for the lattice to work around a serialization bug in the default Dask-based executor. This issue will be addressed in a later release.*"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "98038505",
   "metadata": {},
   "outputs": [],
   "source": [
    "dispatch_id = ct.dispatch(workflow)(\n",
    "    feats_train=feats_train,\n",
    "    Y_train=Y_train,\n",
    "    feats_val=feats_val,\n",
    "    Y_val=Y_val,\n",
    "    iterations=80,\n",
    "    num_qubits=2,\n",
    "    num_layers=6,\n",
    "    num_train=num_train,\n",
    "    Y=Y,\n",
    ")\n",
    "result = ct.get_result(dispatch_id=dispatch_id, wait=True)\n",
    "weights, bias, training_steps, cost_steps, accuracy_steps = result.result\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "39ead46e",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Workflow completion status: COMPLETED\n"
     ]
    }
   ],
   "source": [
    "print(f\"Workflow completion status: {result.status}\")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "233f83ce",
   "metadata": {},
   "source": [
    "We can plot the continuous output of the variational classifier for the first two dimensions of the Iris data set."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "742b3b9f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure()\n",
    "cm = plt.cm.RdBu\n",
    "\n",
    "# make data for decision regions\n",
    "xx, yy = np.meshgrid(np.linspace(0.0, 1.5, 20), np.linspace(0.0, 1.5, 20))\n",
    "X_grid = [np.array([x, y]) for x, y in zip(xx.flatten(), yy.flatten())]\n",
    "\n",
    "# preprocess grid points like data inputs above\n",
    "padding = 0.3 * np.ones((len(X_grid), 1))\n",
    "X_grid = np.c_[np.c_[X_grid, padding], np.zeros((len(X_grid), 1))]  # pad each input\n",
    "normalization = np.sqrt(np.sum(X_grid**2, -1))\n",
    "X_grid = (X_grid.T / normalization).T  # normalize each input\n",
    "features_grid = np.array(\n",
    "    [get_angles(x) for x in X_grid]\n",
    ")  # angles for state preparation are new features\n",
    "predictions_grid = [variational_classifier(weights, bias, f) for f in features_grid]\n",
    "Z = np.reshape(predictions_grid, xx.shape)\n",
    "\n",
    "# plot decision regions\n",
    "cnt = plt.contourf(xx, yy, Z, levels=np.arange(-1, 1.1, 0.1), cmap=cm, alpha=0.8, extend=\"both\")\n",
    "plt.contour(xx, yy, Z, levels=[0.0], colors=(\"black\",), linestyles=(\"--\",), linewidths=(0.8,))\n",
    "plt.colorbar(cnt, ticks=[-1, 0, 1])\n",
    "\n",
    "# plot data\n",
    "plt.scatter(\n",
    "    X_train[:, 0][Y_train == 1],\n",
    "    X_train[:, 1][Y_train == 1],\n",
    "    c=\"b\",\n",
    "    marker=\"o\",\n",
    "    edgecolors=\"k\",\n",
    "    label=\"class 1 train\",\n",
    ")\n",
    "plt.scatter(\n",
    "    X_val[:, 0][Y_val == 1],\n",
    "    X_val[:, 1][Y_val == 1],\n",
    "    c=\"b\",\n",
    "    marker=\"^\",\n",
    "    edgecolors=\"k\",\n",
    "    label=\"class 1 validation\",\n",
    ")\n",
    "plt.scatter(\n",
    "    X_train[:, 0][Y_train == -1],\n",
    "    X_train[:, 1][Y_train == -1],\n",
    "    c=\"r\",\n",
    "    marker=\"o\",\n",
    "    edgecolors=\"k\",\n",
    "    label=\"class -1 train\",\n",
    ")\n",
    "plt.scatter(\n",
    "    X_val[:, 0][Y_val == -1],\n",
    "    X_val[:, 1][Y_val == -1],\n",
    "    c=\"r\",\n",
    "    marker=\"^\",\n",
    "    edgecolors=\"k\",\n",
    "    label=\"class -1 validation\",\n",
    ")\n",
    "\n",
    "plt.legend()\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9c7f86e9",
   "metadata": {},
   "source": [
    "<h3>References </h3>\n",
    "\n",
    "<UL>\n",
    "    <LI>https://pennylane.ai/qml/demos/tutorial_variational_classifier.html</LI>\n",
    "    <LI>https://covalent.readthedocs.io/en/latest/index.html</LI>\n",
    "</UL>"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "new",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3"
  },
  "vscode": {
   "interpreter": {
    "hash": "65f23ff11413a1b24e6045f226bbb649c5d31fd62a4c12b34b399c99ac705181"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
